package com.rainman.noswagger.core;

import com.github.javaparser.JavaParser;
import com.rainman.noswagger.core.*;
import com.rainman.noswagger.def_interface.*;
import lombok.Data;

import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;


@Data
public class CoreConfig {

    /**
     * 解析器com.github.javaparser.JavaParser
     */
    private JavaParser javaParser;

    /**
     * 默认源码编码
     */
    private String characterEncoding="UTF-8";

    /**
     * 源码路径
     */
    private String codePath=".";

    /**
     * 类回调接口
     */
    private ClassInfoInterface classInfoInterface;
    /**
     * 方法回调接口
     */
    private MethodInfoInterface methodInfoInterface;


    private Map<String, MethodTagWorkerInterface<?>> methodTagWorkerInterfaceMap;


    public CoreConfig(){
        javaParser=new JavaParser();
        javaParser.getParserConfiguration().setCharacterEncoding(Charset.forName(characterEncoding));
        methodTagWorkerInterfaceMap =new HashMap<>();
        //excludePath=new ArrayList<>();

        //系统提供了默认的接口实现
        classInfoInterface=new DefClassInfoWorker();
        methodInfoInterface =new DefMethodInfoWorker();

        //预处理@name
        MethodTagNameWorker methodTagNameWorker=new MethodTagNameWorker();
        methodTagWorkerInterfaceMap.put(methodTagNameWorker.tagName(),methodTagNameWorker);

        //预处理@desc
        MethodTagDescWorker methodTagDescWorker=new MethodTagDescWorker();
        methodTagWorkerInterfaceMap.put(methodTagDescWorker.tagName(),methodTagDescWorker);

        //预处理@group
        MethodTagGroupWorker methodTagGroupWorker=new MethodTagGroupWorker();
        methodTagWorkerInterfaceMap.put(methodTagGroupWorker.tagName(),methodTagGroupWorker);

        //预处理@eback
        MethodTagEBackWorker methodTagEBackWorker=new MethodTagEBackWorker();
        methodTagWorkerInterfaceMap.put(methodTagEBackWorker.tagName(),methodTagEBackWorker);

        //预处理@back
        MethodTagBackWorker methodTagBackWorker=new MethodTagBackWorker();
        methodTagWorkerInterfaceMap.put(methodTagBackWorker.tagName(),methodTagBackWorker);

        //预处理@deprecated
        MethodTagDeprecatedWorker methodTagDeprecatedWorker=new MethodTagDeprecatedWorker();
        methodTagWorkerInterfaceMap.put(methodTagDeprecatedWorker.tagName(),methodTagDeprecatedWorker);

        //@param进行了特殊处理，DefMethodParamInfoWorker

    }

    public MethodTagWorkerInterface<?> getMethodTagWork(String name) {
        return methodTagWorkerInterfaceMap.get(name);
    }

    public void putMethodTagWork(MethodTagWorkerInterface<?> methodTagWorkerInterface) {
         methodTagWorkerInterfaceMap.put(methodTagWorkerInterface.tagName(),methodTagWorkerInterface);
    }

    public void setCharacterEncoding(String characterEncoding) {
        this.characterEncoding = characterEncoding;
        javaParser.getParserConfiguration().setCharacterEncoding(Charset.forName(characterEncoding));
    }


}
